package priv.conceit.study.book.thread.chapter1.parts2;

import java.util.concurrent.TimeUnit;

/**
 * 1.2
 * 第一章第二节
 * 快速启动一个线程
 * <p>
 * 听音乐和看新闻两个任务看起来回同时进行
 * 但是很可惜 只能有一个任务得到执行
 * main 线程里直接调用实际上还是单线程
 * <p>
 * 使用jconsole 或者jstack命令来查看当前jvm中运行的具体线程
 * <p>
 * jconsole:
 * 点击JDK/bin 目录下面的jconsole.exe 即可启动(管理员)
 * 选择本地方法的pid 既可进行链接 在线程页面下进行查看
 * <p>
 * jstack:
 * 在jdk/bin 目录下运行一下两个命令（管理员）
 * 通过使用 jps 命令获取需要监控的进程的pid
 * 然后使用 jstack pid 命令查看线程的堆栈信息
 * <p>
 * 如果两个线程没有起名，那么默认名就是Thread-0 Thread-1
 *
 * @author Conceit
 * @since 1.0.0, 2019/6/1
 */
public class TryConcurrency {

	public static void main(String[] args) throws InterruptedException {
		//main 方法单线程调用
		//browseNews();
		//enjoyMusic();
		sleep(20);
		//多线程调用
		multithreadingBrowseNews();
		multithreadingEnjoyMusic();
	}

	private static void browseNews() {
		for (; ; ) {
			System.out.println("browseNews");
			try {
				Thread.sleep(1000L);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//sleep(1);
		}
	}

	private static void enjoyMusic() {
		for (; ; ) {
			System.out.println("enjoyMusic");
			try {
				Thread.sleep(1000L);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//sleep(1);
		}
	}

	private static void sleep(int seconds) {
		try {
			TimeUnit.SECONDS.sleep(seconds);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 使用java8 创建线程
	 */
	private static void multithreadingBrowseNews() {
		new Thread(TryConcurrency::browseNews).start();
	}

	/**
	 * java8之前创建线程
	 * <p>
	 * 创建新线程并重写run方法，将具体的执行方法交给run方法体，调用线程的start启动线程
	 * 如果使用线程的run方法并不是多线程
	 */
	private static void multithreadingEnjoyMusic() {
		new Thread() {
			@Override
			public void run() {
				enjoyMusic();
			}
		}.start();
	}
}
